﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

using Fennec;

namespace IHM.ClassesFonction
{
    public class ReactionEvenementCarte
    {
        FenetreJeu fenetre;

        public ReactionEvenementCarte(FenetreJeu f)
        {
            fenetre = f;
        }

        // Carte

        // + EV_ET_CREE,
        // + EV_ENS_CREE,
        // + EV_DIR_CREE.
        public void evenementCarteAjouterUnite(EElement element, int X, int Y, int civ)
        {
            switch (element)
            {
                case EElement.EL_ET:
                    fenetre.casesIHM[X, Y].etudiants.Text = (++fenetre.casesIHM[X, Y].nombreEtudiants).ToString();
                    fenetre.casesIHM[X, Y].etudiants.Foreground = fenetre.couleurs[fenetre.partie.civilisation_courante];

                    if (!fenetre.infoGridCarte.Children.Contains(fenetre.casesIHM[X, Y].etudiants))
                    {
                        fenetre.infoGridCarte.Children.Add(fenetre.casesIHM[X, Y].etudiants);
                    }
                    break;
                case EElement.EL_ENS:
                    fenetre.casesIHM[X, Y].enseignants.Text = (++fenetre.casesIHM[X, Y].nombreEnseignants).ToString();
                    fenetre.casesIHM[X, Y].enseignants.Foreground = fenetre.couleurs[fenetre.partie.civilisation_courante];

                    if (!fenetre.infoGridCarte.Children.Contains(fenetre.casesIHM[X, Y].enseignants))
                    {
                        fenetre.infoGridCarte.Children.Add(fenetre.casesIHM[X, Y].enseignants);
                    }
                    break;
                case EElement.EL_DIR:
                    fenetre.casesIHM[X, Y].directeur.Text = "Dir";
                    fenetre.casesIHM[X, Y].directeur.Foreground = fenetre.couleurs[fenetre.partie.civilisation_courante];
                    fenetre.casesIHM[X, Y].directeurExiste = true;

                    if (!fenetre.infoGridCarte.Children.Contains(fenetre.casesIHM[X, Y].directeur))
                    {
                        fenetre.infoGridCarte.Children.Add(fenetre.casesIHM[X, Y].directeur);
                    }
                    break;
            }

            // Brouillard de guerre
            for (int i = X - 2; i <= X + 2; i++)
            {
                for (int j = Y - 2; j <= Y + 2; j++)
                {
                    if (i >= 0 && i < fenetre.cote && j >= 0 && j < fenetre.cote)
                    {
                        if (++fenetre.nombreVoyeurs[i, j] == 1)
                        {
                            fenetre.casesVisibles[i, j] = true;
                            fenetre.casesIHM[i, j].etudiants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].enseignants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].directeur.Visibility = Visibility.Visible;
                        }
                    }
                }
            }
        }

        // EV_UNITE_TUEE
        public void evenementCarteUniteTuee(EElement element, int X, int Y)
        {
            switch (element)
            {
                case EElement.EL_ET:
                    fenetre.casesIHM[X, Y].etudiants.Text = (--fenetre.casesIHM[X, Y].nombreEtudiants).ToString();

                    if (fenetre.casesIHM[X, Y].nombreEtudiants == 0)
                    {
                        foreach (UIElement e in fenetre.infoGridCarte.Children)
                        {
                            if (e.Equals(fenetre.casesIHM[X, Y].etudiants))
                            {
                                fenetre.infoGridCarte.Children.Remove(e);
                                break;
                            }
                        }
                    }
                    break;
                case EElement.EL_ENS:
                    fenetre.casesIHM[X, Y].enseignants.Text = (--fenetre.casesIHM[X, Y].nombreEnseignants).ToString();

                    if (fenetre.casesIHM[X, Y].nombreEnseignants == 0)
                    {
                        foreach (UIElement e in fenetre.infoGridCarte.Children)
                        {
                            if (e.Equals(fenetre.casesIHM[X, Y].enseignants))
                            {
                                fenetre.infoGridCarte.Children.Remove(e);
                                break;
                            }
                        }
                    }
                    break;
                case EElement.EL_DIR:
                    fenetre.casesIHM[X, Y].directeurExiste = false;
                    fenetre.infoGridCarte.Children.Remove(fenetre.casesIHM[X, Y].directeur);
                    break;
            }

            // Brouillard de guerre
            for (int i = X - 2; i <= X + 2; i++)
            {
                for (int j = Y - 2; j <= Y + 2; j++)
                {
                    if (i >= 0 && i < fenetre.cote && j >= 0 && j < fenetre.cote)
                    {
                        if (--fenetre.nombreVoyeurs[i, j] == 0)
                        {
                            fenetre.casesVisibles[i, j] = false;
                            fenetre.casesIHM[i, j].etudiants.Visibility = Visibility.Hidden;
                            fenetre.casesIHM[i, j].enseignants.Visibility = Visibility.Hidden;
                            fenetre.casesIHM[i, j].directeur.Visibility = Visibility.Hidden;
                        }
                    }
                }
            }
        }

        // EV_VILLE_CREEE,
        public void evenementCarteAjouterVille(int X, int Y, int civ)
        {
            fenetre.casesIHM[X, Y].ville.Fill = fenetre.couleurs[civ];
            fenetre.casesIHM[X, Y].villeExiste = true;
            fenetre.infoGridCarte.Children.Add(fenetre.casesIHM[X, Y].ville);

            // Brouillard de guerre
            for (int i = X - 3; i <= X + 3; i++)
            {
                for (int j = Y - 3; j <= Y + 3; j++)
                {
                    if (i >= 0 && i < fenetre.cote && j >= 0 && j < fenetre.cote)
                    {
                        if (++fenetre.nombreVoyeurs[i, j] == 1)
                        {
                            fenetre.casesVisibles[i, j] = true;
                            fenetre.casesIHM[i, j].etudiants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].enseignants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].directeur.Visibility = Visibility.Visible;
                        }
                    }
                }
            }
        }

        // EV_VILLE_DETRUITE
        public void evenementCarteVilleDetruite(int X, int Y, int nouvelleCivilisation)
        {
            fenetre.casesIHM[X, Y].ville.Fill = fenetre.couleurs[nouvelleCivilisation];

            // Brouillard de guerre
            for (int i = X - 3; i <= X + 3; i++)
            {
                for (int j = Y - 3; j <= Y + 3; j++)
                {
                    if (i >= 0 && i < fenetre.cote && j >= 0 && j < fenetre.cote)
                    {
                        if (--fenetre.nombreVoyeurs[i, j] == 0)
                        {
                            fenetre.casesVisibles[i, j] = false;
                            fenetre.casesIHM[i, j].etudiants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].enseignants.Visibility = Visibility.Visible;
                            fenetre.casesIHM[i, j].directeur.Visibility = Visibility.Visible;
                        }
                    }
                }
            }
        }

        //      EV_CARTE_ACTION_ALLER
        // +    EV_CARTE_ACTION_ATTAQUER
        public void evenementCarteActionVue(Enumerations.EAction action)
        {
            if (fenetre.actionCommencee)
            {
                fenetre.actionCommencee = false;
                fenetre.actionAllerCommencée = false;

                // Réaactiver autres boutons + demettre en valeur celui en cours
                switch (action)
                {
                    case Enumerations.EAction.ACTION_ALLER:
                        fenetre.infoActionAller.Background = fenetre.couleurBoutonInitiale;
                        fenetre.infoActionAller.Content = "Aller à la case";
                        fenetre.infoActionAller.Width = 100;

                        fenetre.infoActionAttaquer.IsEnabled = true;
                        fenetre.infoCaseUnités.IsEnabled = true;
                        break;
                    case Enumerations.EAction.ACTION_ATTAQUER:
                        fenetre.infoActionAttaquer.Background = fenetre.couleurBoutonInitiale;
                        fenetre.infoActionAttaquer.Content = "Attaquer";
                        fenetre.infoActionAttaquer.Width = 100;

                        fenetre.infoActionAller.IsEnabled = true;
                        break;
                    //case Enumerations.EAction.ACTION_VOIR:
                    //    break;
                    default:
                        break;
                }

                fenetre.infoActionFonder.IsEnabled = true;
                fenetre.infoActionCreerEt.IsEnabled = true;
                fenetre.infoActionCreerEns.IsEnabled = true;
                fenetre.infoActionCreerDir.IsEnabled = true;
                fenetre.infoFinTour.IsEnabled = true;

                // Rétablir les rectangles et vider la liste
                foreach (System.Drawing.Point position in fenetre.listeCasesAColorer)
                {
                    foreach (UIElement shape in fenetre.infoGridCarte.Children)
                    {
                        if (shape.GetType() == typeof(System.Windows.Shapes.Rectangle))
                        {
                            int x = Grid.GetColumn(shape);
                            int y = Grid.GetRow(shape);

                            if (x == position.X && y == position.Y)
                            {
                                ((System.Windows.Shapes.Rectangle)shape).Stroke = System.Windows.Media.Brushes.Black;
                                ((System.Windows.Shapes.Rectangle)shape).StrokeThickness = 1;
                            }
                        }
                    }
                }
                fenetre.listeCasesAColorer.Clear();
            }
            else
            {
                fenetre.actionCommencee = true;

                // Désactiver autres boutons + mettre en valeur celui en cours
                switch (action)
                {
                    case Enumerations.EAction.ACTION_ALLER:
                        fenetre.infoActionAller.Background = System.Windows.Media.Brushes.Gold;
                        fenetre.infoActionAller.Content = "Aller (Finir)";
                        fenetre.infoActionAller.Width = 120;

                        fenetre.infoActionAttaquer.IsEnabled = false;
                        fenetre.infoCaseUnités.IsEnabled = false;
                        break;
                    case Enumerations.EAction.ACTION_ATTAQUER:
                        fenetre.infoActionAttaquer.Background = System.Windows.Media.Brushes.Gold;
                        fenetre.infoActionAttaquer.Content = "Attaquer (Finir)";
                        fenetre.infoActionAttaquer.Width = 120;

                        fenetre.infoActionAller.IsEnabled = false;
                        break;
                    //case Enumerations.EAction.ACTION_VOIR:
                    //    break;
                    default:
                        break;
                }

                fenetre.infoActionFonder.IsEnabled = false;
                fenetre.infoActionCreerEt.IsEnabled = false;
                fenetre.infoActionCreerEns.IsEnabled = false;
                fenetre.infoActionCreerDir.IsEnabled = false;
                fenetre.infoFinTour.IsEnabled = false;

                // Remplir la liste de cases à colorer
                int c;
                int l;

                    // [TEMPORAIRE]
                    UnitéEtudiant u = new UnitéEtudiant(new System.Drawing.Point(fenetre.partie.position_sélectionnée.X, fenetre.partie.position_sélectionnée.Y));
                    u.déplacement = 5;

                // for (c = 0; c < partie.carte.getDimensions().X; c++)
                for (c = 0; c < fenetre.cote; c++) // [TEMPORAIRE]
                {
                    // for (l = 0; l < partie.carte.getDimensions().X; l++)
                    for (l = 0; l < fenetre.cote; l++) // [TEMPORAIRE]
                    {
                        System.Drawing.Point p1 = new System.Drawing.Point(c, l);

                        switch (action)
                        {
                            case Enumerations.EAction.ACTION_ALLER:
                                // if (((Unité)partie.unités_sélectionnées[partie.unité_selectionnée]).peutSeDéplacer(p))
                                if (u.peutSeDéplacer(p1)) // [TEMPORAIRE]
                                {
                                    //listeCasesAtteignables.Add(new System.Drawing.Point(c,l));
                                    fenetre.listeCasesAColorer.Add(new System.Drawing.Point(c, l));
                                }
                                break;
                            case Enumerations.EAction.ACTION_ATTAQUER:
                                // if (((Unité)partie.unités_sélectionnées[partie.unité_selectionnée]).peutAttaquer(p))
                                if (u.peutAttaquer(p1)) // [TEMPORAIRE]
                                {
                                    //listeCasesAtteignables.Add(new System.Drawing.Point(c,l));
                                    fenetre.listeCasesAColorer.Add(new System.Drawing.Point(c, l));
                                }
                                break;
                            //case Enumerations.EAction.ACTION_VOIR:
                            //    break;
                            default:
                                break;
                        }
                    }
                }

                // Parcourir les rectangles, regarder si leurs cases associées sont à colorer, si oui, les colorer
                System.Drawing.Point p;

                foreach (UIElement shape in fenetre.infoGridCarte.Children)
                {
                    if (shape.GetType() == typeof(System.Windows.Shapes.Rectangle))
                    {

                        int x = Grid.GetColumn(shape);
                        int y = Grid.GetRow(shape);
                        p = new System.Drawing.Point(x, y);
                        if (fenetre.listeCasesAColorer.Contains(p))
                        {
                            switch (action)
                            {
                                case Enumerations.EAction.ACTION_ALLER:
                                    ((System.Windows.Shapes.Rectangle)shape).Stroke = System.Windows.Media.Brushes.White;
                                    break;
                                case Enumerations.EAction.ACTION_ATTAQUER:
                                    ((System.Windows.Shapes.Rectangle)shape).Stroke = System.Windows.Media.Brushes.Red;
                                    break;
                                //case Enumerations.EAction.ACTION_VOIR:
                                //break;
                                default:
                                    break;
                            }
                            ((System.Windows.Shapes.Rectangle)shape).StrokeThickness = 2;
                        }
                    }
                }
            }
        }
    }
}
